Supporting schools reopening decision making in Dallas Fort Worth using Facebook symptoms public data


We sought to develop a prediction model that accurately predicts COVID-19 community transmission in a timely manner, to support school-reopening decision making and school-based COVID-19 surveillance strategy. Our model leverages county-level Facebook Symptom Tracker data along with Apple mobility data to predict daily rates of COVID-19 community transmission to guide decision making for safe school reopening, timely closure, or school-based surveillance testing. By using our model, School and Public Health might implement interventions to mitigate the risk for school-based COVID-19 transmission, enhance students’ educational experience, and limit disruptive school closures.




# Loading sequentially R codes
source("load-data-ts.R")
source("tf_apl.R")
source("tf_fb_sci.R")
source("tf_sg.R")

Variables selection


Loading data from Facebook Symptoms datasets and other public datasets for analysis:

  1. Facebook survey data
  • Facebook Covid Like Illness (smoothed and weighted) as “cli”
  • Facebook Community Covid Like Illness (smoothed and weighted) as “cmnt_cli”
  1. Safegraph mobility data
  • Average time spent at full-time work location
  • Average time spent at hall-time work location
  1. Apple mobility data

This data contains device change in mobility using Jan 13th, 2020 as reference to track changes.

  • Walking
  • Transit
  • Driving

Data exploration

Facebook Data

Facebook Plot

fb_df_tarrant %>%
  melt(id.vars = c("date"), measure.vars = c("cli", "cmnt_cli")) %>% 
  group_by(variable) %>%
  group_map(~plot_ly(.,x=~date, y=~value,color = ~variable, mode = "lines"), keep=TRUE) %>%
  subplot(nrows = 1, shareX = TRUE, shareY = FALSE) %>%
  layout(title="Facebook CLI vs Community CLI")

NA
NA
Facebook data

head(fb_df_tarrant)
NA

Safegraph Data

Safegraph Plot

sg_df_tarrant %>%
  plot_ly(x=~date) %>%
  add_trace(y=~fulltime, mode="lines", name="Fulltime") %>%
  add_trace(y=~parttime, mode="lines", name="Parttime")

NA
NA
Safegraph data

head(sg_df_tarrant)
NA

Apple Data

Apple Plot

apple_mob_tarrant %>%
  plot_ly(x=~date) %>% 
  add_trace(y=~driving, mode="lines", name="driving") %>%
  add_trace(y=~walking, mode="lines", name="walking") %>%
  add_trace(y=~transit, mode="lines", name="transit") %>%
  layout(title="Apple mobility data")

NA
Mobility data

Features engineering

From apple data, we create a composite indicator by combining the effect of driving and transit variables into a single variable which the transit ratio to transit + driving. \(transit/(transit+driving)\). This variable is calculated based on the assumption that the higher the transit, the higher the risk of infection and the higher the driving, the lower the risk of infection, hence driving is at the denominator of the formula and transit as well is there to normalize the value between 0 and 1.


plot_ly(data = df_final, x=~date) %>% 
  add_trace(y=~comp_indice, mode="lines") %>%
  layout(title="Apple Mobility Composite indicator", yaxis=list(title="Mobility index"))

NA

Combined dataset

Data


df_final
NA

##############################################################
#                   NEW PHASE                                #
############## Vector Error correction Model #################
require(bvartools)
require(urca)
require(vars)
require(dynlm)
require(forecast)

k <- nrow(df_final)-14


##############################################################
####  Making the dataset stationary by first differencing ####

df_final_ts <- ts(df_final[1:k,-1])
df_final_ts_sta <- diff(df_final_ts,1)


##############################################################
############## Creating the test timeseries ##################
df_test <- na.omit(df_final[(k+1):nrow(df_final),])

df_test_ts <- ts(df_test[,-c(1:2)])

### Stationarizing the test dataset
df_test_ts_sta <- diff(df_test_ts,1)

Original timeseries


df_1 <- df_final[1:k,-1]

names(df_1) <- c("Positivity", "CLI", "Community_CLI", "Fulltime", "Partime", "Apple_comp_index")

plot(ts(df_1), main="Figure 1: Time series plot non-stationary")

NA
NA

Stationary timeseries

This is the representation of the time series after applying the first difference with the first lag value


df_2 <- df_final[1:k,-1]

names(df_2) <- c("Positivity", "CLI", "Community_CLI", "Fulltime", "Partime", "Apple_comp_index")

df_2 <- na.omit(diff(ts(df_2), 1))

plot(df_2, main="Figure 1: Time series plot non-stationary")

Building the VAR Models

VAR Model summary


source("functions.R")

##############################################################
################## VAR MODEL BUILDING ########################

#Lag selection
var_lag <- VARselect(df_final_ts, lag.max = 8, type = "both", season = 7)

# Extracting the lag seleciton by AIC
max_lag = as.numeric(var_lag$selection[1])

## Option 1: VAR Model
VAR_pos <- VAR(df_final_ts, lag.max = max_lag, type = "both", season = 7)

summary(VAR_pos$varresult$pos_ma)

Call:
lm(formula = y ~ -1 + ., data = datamat)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.42436 -0.05971  0.01085  0.08425  0.27286 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)   
pos_ma.l1       8.070e-01  1.998e-01   4.040  0.00122 **
cli.l1         -1.344e+00  7.440e-01  -1.807  0.09235 . 
cmnt_cli.l1    -1.036e-01  2.014e-01  -0.514  0.61519   
fulltime.l1    -3.338e+02  3.578e+02  -0.933  0.36665   
parttime.l1     5.891e+01  2.913e+02   0.202  0.84267   
comp_indice.l1  7.240e+00  1.090e+01   0.664  0.51746   
pos_ma.l2      -1.970e-01  2.707e-01  -0.728  0.47882   
cli.l2          1.447e+00  1.069e+00   1.354  0.19704   
cmnt_cli.l2    -1.664e-01  2.121e-01  -0.785  0.44567   
fulltime.l2     6.934e+02  3.602e+02   1.925  0.07481 . 
parttime.l2    -4.368e+02  2.932e+02  -1.490  0.15848   
comp_indice.l2 -1.618e+01  7.338e+00  -2.204  0.04473 * 
pos_ma.l3       2.846e-01  2.261e-01   1.259  0.22864   
cli.l3         -5.064e-01  1.363e+00  -0.372  0.71571   
cmnt_cli.l3     8.607e-02  2.750e-01   0.313  0.75889   
fulltime.l3     9.978e+01  3.372e+02   0.296  0.77165   
parttime.l3    -1.659e+02  2.700e+02  -0.615  0.54874   
comp_indice.l3  4.801e-01  1.076e+01   0.045  0.96504   
pos_ma.l4       1.901e-01  2.538e-01   0.749  0.46621   
cli.l4          2.206e+00  1.466e+00   1.505  0.15462   
cmnt_cli.l4     5.248e-01  2.410e-01   2.177  0.04707 * 
fulltime.l4    -1.840e+02  4.026e+02  -0.457  0.65463   
parttime.l4     3.534e+02  3.106e+02   1.138  0.27429   
comp_indice.l4  9.183e+00  9.580e+00   0.959  0.35402   
pos_ma.l5      -6.050e-01  2.438e-01  -2.482  0.02639 * 
cli.l5         -2.958e-01  1.375e+00  -0.215  0.83274   
cmnt_cli.l5    -3.461e-01  2.412e-01  -1.435  0.17316   
fulltime.l5    -2.157e+02  3.661e+02  -0.589  0.56504   
parttime.l5    -8.510e+01  3.041e+02  -0.280  0.78366   
comp_indice.l5  4.262e+00  9.446e+00   0.451  0.65876   
pos_ma.l6       1.400e-01  2.241e-01   0.625  0.54232   
cli.l6         -8.240e-01  1.284e+00  -0.642  0.53138   
cmnt_cli.l6    -1.576e-02  2.102e-01  -0.075  0.94128   
fulltime.l6    -1.035e+02  4.156e+02  -0.249  0.80689   
parttime.l6     2.932e+02  3.356e+02   0.874  0.39703   
comp_indice.l6  1.880e+01  1.037e+01   1.813  0.09126 . 
pos_ma.l7      -2.797e-01  2.090e-01  -1.338  0.20220   
cli.l7          6.313e-01  1.294e+00   0.488  0.63330   
cmnt_cli.l7     3.847e-01  1.945e-01   1.978  0.06795 . 
fulltime.l7     1.993e+02  4.068e+02   0.490  0.63184   
parttime.l7    -3.576e+02  3.081e+02  -1.161  0.26525   
comp_indice.l7 -1.566e-01  8.060e+00  -0.019  0.98477   
pos_ma.l8       2.256e-01  1.876e-01   1.203  0.24907   
cli.l8         -2.810e-01  8.901e-01  -0.316  0.75692   
cmnt_cli.l8    -3.878e-01  1.495e-01  -2.595  0.02120 * 
fulltime.l8    -7.788e+01  3.522e+02  -0.221  0.82821   
parttime.l8     1.488e+02  2.626e+02   0.567  0.57995   
comp_indice.l8  2.031e+01  9.156e+00   2.218  0.04360 * 
const          -2.266e+00  2.026e+01  -0.112  0.91253   
trend          -2.384e-03  2.416e-02  -0.099  0.92281   
sd1             9.671e-01  3.097e-01   3.122  0.00749 **
sd2             8.229e-01  3.740e-01   2.200  0.04507 * 
sd3             9.718e-01  3.634e-01   2.675  0.01814 * 
sd4             7.229e-01  4.056e-01   1.782  0.09640 . 
sd5             7.702e-01  4.186e-01   1.840  0.08710 . 
sd6             6.906e-01  4.253e-01   1.624  0.12674   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2939 on 14 degrees of freedom
Multiple R-squared:  0.9972,    Adjusted R-squared:  0.986 
F-statistic: 89.66 on 55 and 14 DF,  p-value: 6.546e-12

Coefficient testing


coeftest(VAR_pos$varresult$pos_ma)

t test of coefficients:

                  Estimate  Std. Error t value Pr(>|t|)   
pos_ma.l1       8.0700e-01  1.9976e-01  4.0399 0.001217 **
cli.l1         -1.3442e+00  7.4404e-01 -1.8067 0.092350 . 
cmnt_cli.l1    -1.0355e-01  2.0142e-01 -0.5141 0.615188   
fulltime.l1    -3.3379e+02  3.5777e+02 -0.9330 0.366651   
parttime.l1     5.8907e+01  2.9134e+02  0.2022 0.842674   
comp_indice.l1  7.2397e+00  1.0903e+01  0.6640 0.517464   
pos_ma.l2      -1.9699e-01  2.7073e-01 -0.7276 0.478821   
cli.l2          1.4474e+00  1.0686e+00  1.3545 0.197039   
cmnt_cli.l2    -1.6643e-01  2.1208e-01 -0.7848 0.445674   
fulltime.l2     6.9339e+02  3.6023e+02  1.9248 0.074814 . 
parttime.l2    -4.3683e+02  2.9323e+02 -1.4897 0.158483   
comp_indice.l2 -1.6176e+01  7.3382e+00 -2.2044 0.044729 * 
pos_ma.l3       2.8464e-01  2.2610e-01  1.2589 0.228637   
cli.l3         -5.0642e-01  1.3626e+00 -0.3717 0.715711   
cmnt_cli.l3     8.6075e-02  2.7500e-01  0.3130 0.758894   
fulltime.l3     9.9779e+01  3.3720e+02  0.2959 0.771646   
parttime.l3    -1.6590e+02  2.6998e+02 -0.6145 0.548740   
comp_indice.l3  4.8013e-01  1.0760e+01  0.0446 0.965040   
pos_ma.l4       1.9013e-01  2.5382e-01  0.7491 0.466211   
cli.l4          2.2063e+00  1.4663e+00  1.5047 0.154621   
cmnt_cli.l4     5.2480e-01  2.4105e-01  2.1772 0.047068 * 
fulltime.l4    -1.8402e+02  4.0262e+02 -0.4571 0.654633   
parttime.l4     3.5338e+02  3.1058e+02  1.1378 0.274293   
comp_indice.l4  9.1831e+00  9.5796e+00  0.9586 0.354020   
pos_ma.l5      -6.0500e-01  2.4380e-01 -2.4815 0.026392 * 
cli.l5         -2.9583e-01  1.3749e+00 -0.2152 0.832736   
cmnt_cli.l5    -3.4615e-01  2.4116e-01 -1.4353 0.173162   
fulltime.l5    -2.1573e+02  3.6607e+02 -0.5893 0.565038   
parttime.l5    -8.5103e+01  3.0407e+02 -0.2799 0.783662   
comp_indice.l5  4.2620e+00  9.4460e+00  0.4512 0.658757   
pos_ma.l6       1.3996e-01  2.2410e-01  0.6245 0.542317   
cli.l6         -8.2399e-01  1.2839e+00 -0.6418 0.531382   
cmnt_cli.l6    -1.5763e-02  2.1019e-01 -0.0750 0.941281   
fulltime.l6    -1.0354e+02  4.1565e+02 -0.2491 0.806895   
parttime.l6     2.9318e+02  3.3557e+02  0.8737 0.397032   
comp_indice.l6  1.8799e+01  1.0367e+01  1.8134 0.091260 . 
pos_ma.l7      -2.7969e-01  2.0903e-01 -1.3381 0.202201   
cli.l7          6.3128e-01  1.2944e+00  0.4877 0.633298   
cmnt_cli.l7     3.8474e-01  1.9451e-01  1.9780 0.067950 . 
fulltime.l7     1.9927e+02  4.0681e+02  0.4898 0.631837   
parttime.l7    -3.5758e+02  3.0812e+02 -1.1605 0.265247   
comp_indice.l7 -1.5664e-01  8.0604e+00 -0.0194 0.984769   
pos_ma.l8       2.2561e-01  1.8759e-01  1.2026 0.249067   
cli.l8         -2.8097e-01  8.9011e-01 -0.3157 0.756922   
cmnt_cli.l8    -3.8782e-01  1.4947e-01 -2.5946 0.021197 * 
fulltime.l8    -7.7881e+01  3.5224e+02 -0.2211 0.828206   
parttime.l8     1.4880e+02  2.6262e+02  0.5666 0.579954   
comp_indice.l8  2.0309e+01  9.1563e+00  2.2181 0.043597 * 
const          -2.2664e+00  2.0263e+01 -0.1119 0.912530   
trend          -2.3835e-03  2.4160e-02 -0.0987 0.922812   
sd1             9.6714e-01  3.0974e-01  3.1224 0.007491 **
sd2             8.2287e-01  3.7397e-01  2.2004 0.045068 * 
sd3             9.7180e-01  3.6335e-01  2.6745 0.018138 * 
sd4             7.2290e-01  4.0561e-01  1.7822 0.096402 . 
sd5             7.7015e-01  4.1861e-01  1.8398 0.087099 . 
sd6             6.9058e-01  4.2532e-01  1.6237 0.126736   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Building the VECM Models

VECM Model summary

The model shows 5 point of cointegration by the values of r based on the Johanssen Cointegration testing procedure


##############################################################
################## VECM MODEL BUILDING #######################

k_order <- VAR_pos$p

vecm_model1 <- ca.jo(df_final_ts, ecdet = "none", type = "trace", K=k_order, spec = "transitory")

vecm_model2 <- ca.jo(df_final_ts, ecdet = "none", type = "trace", K=k_order, spec = "transitory", season = 7)

summary(vecm_model2)

###################### 
# Johansen-Procedure # 
###################### 

Test type: trace statistic , with linear trend 

Eigenvalues (lambda):
[1] 0.74897060 0.69483276 0.57991029 0.56611234 0.26541745 0.09155884

Values of teststatistic and critical values of test:

           test 10pct  5pct   1pct
r <= 5 |   6.72  6.50  8.18  11.65
r <= 4 |  28.31 15.66 17.95  23.52
r <= 3 |  86.76 28.71 31.52  37.22
r <= 2 | 147.47 45.23 48.28  55.43
r <= 1 | 230.55 66.49 70.60  78.87
r = 0  | 327.31 85.18 90.39 104.20

Eigenvectors, normalised to first column:
(These are the cointegration relations)

                  pos_ma.l1      cli.l1  cmnt_cli.l1   fulltime.l1   parttime.l1 comp_indice.l1
pos_ma.l1         1.0000000    1.000000     1.000000     1.0000000  1.000000e+00   1.000000e+00
cli.l1           -3.0630550   -3.760839    -3.636171    -1.8949559  3.210515e+01   1.022709e+00
cmnt_cli.l1       0.1418586    4.807900    -2.802619    -0.5026748 -9.783487e-02  -9.549848e-02
fulltime.l1    -223.0901159 5311.200058  -774.263425 -1008.0009570 -3.202675e+03  -8.500281e+03
parttime.l1     732.8951483  263.268810 -3949.644214   846.7288028  3.161644e+03   7.249906e+03
comp_indice.l1   50.4456482 -234.182382 -1949.173112  -117.5251941 -2.581604e+02   6.647874e+02

Weights W:
(This is the loading matrix)

                  pos_ma.l1        cli.l1   cmnt_cli.l1   fulltime.l1   parttime.l1 comp_indice.l1
pos_ma.d      -3.591411e-01 -1.076634e-02 -2.791261e-02 -0.0219036829 -8.589304e-03   2.233327e-03
cli.d         -1.647736e-03  7.846280e-03  5.615503e-03  0.0120897714 -6.588928e-03  -3.071758e-03
cmnt_cli.d     1.429612e-01  4.563878e-02 -1.551966e-02 -0.4713334183  1.185956e-02  -1.646780e-02
fulltime.d     4.510599e-05 -1.578786e-04  6.818415e-06 -0.0001274476 -6.405771e-05  -7.634917e-06
parttime.d    -9.125754e-05 -1.866555e-04  2.066501e-05 -0.0005979152 -7.710192e-05   1.842888e-06
comp_indice.d -1.575304e-03 -5.549697e-05  9.002646e-04 -0.0050749134  5.019504e-04  -2.126127e-04

Forecasting with VECM model

Using first Cointegration point vs existing data

plt_R
[[1]]


[[2]]


[[3]]


[[4]]


[[5]]

NA
Prediction accuracy
mape_R
[1] 7.953662

USING THE Full dataset FOR FORECASTING FUTURE DATES WITHOUT AVAILABLE PREDICTORS DATA


##### Test with full data

#Lag selection
var_lag1 <- VARselect(df_full_ts, lag.max = 8, type = "both", season = 7)

# Extracting the lag seleciton by AIC
max_lag1 = as.numeric(var_lag1$selection[1])

## Option 1: VAR Model
VAR_pos1 <- VAR(df_full_ts, lag.max = max_lag, type = "both", season = 7)

summary(VAR_pos1$varresult$pos_ma)

Call:
lm(formula = y ~ -1 + ., data = datamat)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.53270 -0.12753 -0.00723  0.14189  0.65938 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
pos_ma.l1       7.302e-01  1.596e-01   4.575 8.85e-05 ***
cli.l1         -4.392e-01  7.609e-01  -0.577   0.5684    
cmnt_cli.l1     2.193e-02  1.758e-01   0.125   0.9016    
fulltime.l1    -5.622e+02  3.142e+02  -1.790   0.0843 .  
parttime.l1     3.056e+02  2.376e+02   1.286   0.2089    
comp_indice.l1 -2.385e+00  8.258e+00  -0.289   0.7749    
pos_ma.l2      -3.397e-02  2.061e-01  -0.165   0.8703    
cli.l2          7.305e-01  8.534e-01   0.856   0.3992    
cmnt_cli.l2    -1.605e-03  2.070e-01  -0.008   0.9939    
fulltime.l2     7.674e+02  3.789e+02   2.025   0.0525 .  
parttime.l2    -4.404e+02  2.971e+02  -1.483   0.1494    
comp_indice.l2 -1.221e+01  7.162e+00  -1.705   0.0992 .  
pos_ma.l3       1.706e-01  2.042e-01   0.836   0.4105    
cli.l3         -6.269e-01  9.565e-01  -0.655   0.5176    
cmnt_cli.l3    -1.378e-01  2.264e-01  -0.609   0.5477    
fulltime.l3    -4.678e+02  3.652e+02  -1.281   0.2107    
parttime.l3     3.039e+02  2.795e+02   1.087   0.2862    
comp_indice.l3 -5.032e+00  7.478e+00  -0.673   0.5065    
pos_ma.l4       1.095e-01  2.066e-01   0.530   0.6003    
cli.l4          1.403e+00  1.159e+00   1.211   0.2362    
cmnt_cli.l4     2.062e-01  2.224e-01   0.927   0.3616    
fulltime.l4     3.841e+02  3.899e+02   0.985   0.3330    
parttime.l4    -1.299e+02  2.949e+02  -0.440   0.6630    
comp_indice.l4 -1.252e+00  7.633e+00  -0.164   0.8709    
pos_ma.l5      -8.603e-02  2.097e-01  -0.410   0.6848    
cli.l5         -4.620e-01  1.225e+00  -0.377   0.7089    
cmnt_cli.l5    -1.920e-01  1.916e-01  -1.002   0.3248    
fulltime.l5    -4.923e+01  3.979e+02  -0.124   0.9024    
parttime.l5    -2.029e+02  3.105e+02  -0.654   0.5187    
comp_indice.l5  1.181e+01  8.411e+00   1.405   0.1712    
pos_ma.l6       4.217e-02  1.966e-01   0.215   0.8317    
cli.l6          6.116e-01  1.181e+00   0.518   0.6087    
cmnt_cli.l6    -1.329e-01  1.820e-01  -0.730   0.4713    
fulltime.l6    -1.179e+02  3.895e+02  -0.303   0.7643    
parttime.l6     2.029e+02  3.167e+02   0.641   0.5269    
comp_indice.l6  2.353e+00  8.839e+00   0.266   0.7920    
pos_ma.l7      -2.747e-01  1.994e-01  -1.378   0.1792    
cli.l7         -1.430e+00  1.145e+00  -1.249   0.2219    
cmnt_cli.l7     4.568e-01  1.882e-01   2.428   0.0219 *  
fulltime.l7     1.745e+02  3.780e+02   0.462   0.6479    
parttime.l7    -2.230e+02  2.963e+02  -0.753   0.4579    
comp_indice.l7  1.209e+01  7.335e+00   1.648   0.1105    
pos_ma.l8       2.112e-01  1.623e-01   1.301   0.2037    
cli.l8          8.005e-01  7.989e-01   1.002   0.3249    
cmnt_cli.l8    -2.207e-01  1.411e-01  -1.564   0.1292    
fulltime.l8    -1.518e+02  3.005e+02  -0.505   0.6174    
parttime.l8     1.389e+02  2.214e+02   0.627   0.5355    
comp_indice.l8  4.300e+00  7.476e+00   0.575   0.5698    
const           1.770e-01  5.909e+00   0.030   0.9763    
trend           1.897e-02  1.420e-02   1.336   0.1923    
sd1             3.692e-01  2.848e-01   1.296   0.2054    
sd2             7.708e-01  3.619e-01   2.130   0.0421 *  
sd3             6.949e-01  3.951e-01   1.759   0.0896 .  
sd4             4.818e-01  3.671e-01   1.312   0.2000    
sd5             5.321e-01  3.997e-01   1.331   0.1938    
sd6            -1.408e-01  3.752e-01  -0.375   0.7102    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3788 on 28 degrees of freedom
Multiple R-squared:  0.9912,    Adjusted R-squared:  0.9741 
F-statistic: 57.67 on 55 and 28 DF,  p-value: < 2.2e-16

k_order1 <- VAR_pos1$p

vecm_model11 <- ca.jo(df_full_ts, ecdet = "none", type = "trace", K=k_order, spec = "transitory")

vecm_model21 <- ca.jo(df_full_ts, ecdet = "none", type = "trace", K=k_order, spec = "transitory", season = 7)

summary(vecm_model21)

###################### 
# Johansen-Procedure # 
###################### 

Test type: trace statistic , with linear trend 

Eigenvalues (lambda):
[1] 0.634688487 0.543896242 0.318314083 0.257413375 0.124878165 0.003740139

Values of teststatistic and critical values of test:

           test 10pct  5pct   1pct
r <= 5 |   0.31  6.50  8.18  11.65
r <= 4 |  11.52 15.66 17.95  23.52
r <= 3 |  36.52 28.71 31.52  37.22
r <= 2 |  68.71 45.23 48.28  55.43
r <= 1 | 134.65 66.49 70.60  78.87
r = 0  | 219.24 85.18 90.39 104.20

Eigenvectors, normalised to first column:
(These are the cointegration relations)

                  pos_ma.l1       cli.l1  cmnt_cli.l1 fulltime.l1  parttime.l1 comp_indice.l1
pos_ma.l1          1.000000     1.000000    1.0000000     1.00000     1.000000      1.0000000
cli.l1            -6.077475    -8.090654   -0.4007323   -44.10591    -4.373226     -4.7241972
cmnt_cli.l1       -6.835700    -2.594450   -0.2700501    -1.43946     0.479617      0.2376699
fulltime.l1    -9334.324692 -3190.270551 -900.5471740  3483.59746 -3325.101247    420.2072931
parttime.l1     3308.323566   365.226034  953.4601694 -3949.64766  3133.694358    255.7459101
comp_indice.l1   689.757393   289.505559  -82.3971774  -383.70258   -23.139995    -81.7596070

Weights W:
(This is the loading matrix)

                  pos_ma.l1        cli.l1   cmnt_cli.l1   fulltime.l1   parttime.l1 comp_indice.l1
pos_ma.d       3.766836e-02 -8.446051e-02 -0.0797529129 -1.894378e-03 -1.840294e-02   8.570906e-03
cli.d         -7.255163e-03 -3.541575e-03  0.0127383094  8.235237e-03  2.100576e-03   8.804290e-05
cmnt_cli.d    -2.858606e-02  1.627182e-02  0.0809155956 -5.732026e-03 -4.453219e-02  -1.339407e-02
fulltime.d     3.466038e-05  9.102563e-05 -0.0001571358  3.258298e-05 -3.612136e-05   1.795908e-05
parttime.d     1.015895e-05  9.599685e-05 -0.0004022396  3.284365e-05 -4.678241e-05   3.270886e-05
comp_indice.d -5.511619e-04 -3.345934e-04  0.0055034738 -4.418049e-05 -2.522533e-04   5.019480e-04
save(VAR_pos_Rs, "VAR_pos_Rs.rda")
Error in save(VAR_pos_Rs, "VAR_pos_Rs.rda") : 
  object ‘VAR_pos_Rs.rda’ not found
LS0tDQp0aXRsZTogIlRoZSBDT1ZJRC0xOSBTeW1wdG9tIERhdGEgQ2hhbGxlbmdlIC0gUGhhc2UgSSBBcHBsaWNhdGlvbiINCm91dHB1dDogDQogIGh0bWxfbm90ZWJvb2s6DQogICAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICAgIGNzczogInN0eWxlLmNzcyINCi0tLQ0KDQo8cD48YnI+PGJyPg0KDQojIyMgU3VwcG9ydGluZyBzY2hvb2xzIHJlb3BlbmluZyBkZWNpc2lvbiBtYWtpbmcgaW4gRGFsbGFzIEZvcnQgV29ydGggdXNpbmcgRmFjZWJvb2sgc3ltcHRvbXMgcHVibGljIGRhdGENCg0KPGRpdj4NCjxicj4NCjxmb250IGFsaWduPSJqdXN0aWZ5Ij5XZSBzb3VnaHQgdG8gZGV2ZWxvcCBhIHByZWRpY3Rpb24gbW9kZWwgdGhhdCBhY2N1cmF0ZWx5IHByZWRpY3RzIENPVklELTE5IGNvbW11bml0eSB0cmFuc21pc3Npb24gaW4gYSB0aW1lbHkgbWFubmVyLCB0byBzdXBwb3J0IHNjaG9vbC1yZW9wZW5pbmcgZGVjaXNpb24gbWFraW5nIGFuZCBzY2hvb2wtYmFzZWQgQ09WSUQtMTkgc3VydmVpbGxhbmNlIHN0cmF0ZWd5LiBPdXIgbW9kZWwgbGV2ZXJhZ2VzIGNvdW50eS1sZXZlbCBGYWNlYm9vayBTeW1wdG9tIFRyYWNrZXIgZGF0YSBhbG9uZyB3aXRoIEFwcGxlIG1vYmlsaXR5IGRhdGEgdG8gcHJlZGljdCBkYWlseSByYXRlcyBvZiBDT1ZJRC0xOSBjb21tdW5pdHkgdHJhbnNtaXNzaW9uIHRvIGd1aWRlIGRlY2lzaW9uIG1ha2luZyBmb3Igc2FmZSBzY2hvb2wgcmVvcGVuaW5nLCB0aW1lbHkgY2xvc3VyZSwgb3Igc2Nob29sLWJhc2VkIHN1cnZlaWxsYW5jZSB0ZXN0aW5nLiBCeSB1c2luZyBvdXIgbW9kZWwsIFNjaG9vbCBhbmQgUHVibGljIEhlYWx0aCBtaWdodCBpbXBsZW1lbnQgaW50ZXJ2ZW50aW9ucyB0byBtaXRpZ2F0ZSB0aGUgcmlzayBmb3Igc2Nob29sLWJhc2VkIENPVklELTE5IHRyYW5zbWlzc2lvbiwgZW5oYW5jZSBzdHVkZW50c+KAmSBlZHVjYXRpb25hbCBleHBlcmllbmNlLCBhbmQgbGltaXQgZGlzcnVwdGl2ZSBzY2hvb2wgY2xvc3VyZXMuPC9mb250PjwvZGl2Pg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQpzb3VyY2UoImxpYnJhcmllcy5SIikNCg0KYGBgDQoNCjwvcD4NCg0KPGRpdj4NCg0KPGRpdj4NCjxwPjxicj48YnI+DQoNCg0KDQpgYGB7ciBlY2hvPVRSVUV9DQoNCiMgTG9hZGluZyBzZXF1ZW50aWFsbHkgUiBjb2Rlcw0Kc291cmNlKCJsb2FkLWRhdGEtdHMuUiIpDQpzb3VyY2UoInRmX2FwbC5SIikNCnNvdXJjZSgidGZfZmJfc2NpLlIiKQ0Kc291cmNlKCJ0Zl9zZy5SIikNCg0KYGBgDQoNCiMjIyMgVmFyaWFibGVzIHNlbGVjdGlvbiANCjxwPjxicj4NCkxvYWRpbmcgZGF0YSBmcm9tIEZhY2Vib29rIFN5bXB0b21zIGRhdGFzZXRzIGFuZCBvdGhlciBwdWJsaWMgZGF0YXNldHMgZm9yIGFuYWx5c2lzOg0KDQoxLiBGYWNlYm9vayBzdXJ2ZXkgZGF0YQ0KDQogICogRmFjZWJvb2sgQ292aWQgTGlrZSBJbGxuZXNzIChzbW9vdGhlZCBhbmQgd2VpZ2h0ZWQpIGFzICJjbGkiDQogICogRmFjZWJvb2sgQ29tbXVuaXR5IENvdmlkIExpa2UgSWxsbmVzcyAoc21vb3RoZWQgYW5kIHdlaWdodGVkKSBhcyAiY21udF9jbGkiDQoNCjIuIFNhZmVncmFwaCBtb2JpbGl0eSBkYXRhDQoNCiAgKiBBdmVyYWdlIHRpbWUgc3BlbnQgYXQgZnVsbC10aW1lIHdvcmsgbG9jYXRpb24NCiAgKiBBdmVyYWdlIHRpbWUgc3BlbnQgYXQgaGFsbC10aW1lIHdvcmsgbG9jYXRpb24gIA0KDQozLiBBcHBsZSBtb2JpbGl0eSBkYXRhDQoNClRoaXMgZGF0YSBjb250YWlucyBkZXZpY2UgY2hhbmdlIGluIG1vYmlsaXR5IHVzaW5nIEphbiAxM3RoLCAyMDIwIGFzIHJlZmVyZW5jZSB0byB0cmFjayBjaGFuZ2VzLg0KDQogICogV2Fsa2luZw0KICAqIFRyYW5zaXQNCiAgKiBEcml2aW5nDQoNCg0KIyMjIERhdGEgZXhwbG9yYXRpb24gDQoNCiMjIyMgRmFjZWJvb2sgRGF0YSB7LnRhYnNldH0NCg0KIyMjIyMgRmFjZWJvb2sgUGxvdA0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBvdXQud2lkdGg9IjgwJSJ9DQoNCmZiX2RmX3RhcnJhbnQgJT4lDQogIG1lbHQoaWQudmFycyA9IGMoImRhdGUiKSwgbWVhc3VyZS52YXJzID0gYygiY2xpIiwgImNtbnRfY2xpIikpICU+JSANCiAgZ3JvdXBfYnkodmFyaWFibGUpICU+JQ0KICBncm91cF9tYXAofnBsb3RfbHkoLix4PX5kYXRlLCB5PX52YWx1ZSxjb2xvciA9IH52YXJpYWJsZSwgbW9kZSA9ICJsaW5lcyIpLCBrZWVwPVRSVUUpICU+JQ0KICBzdWJwbG90KG5yb3dzID0gMSwgc2hhcmVYID0gVFJVRSwgc2hhcmVZID0gRkFMU0UpICU+JQ0KICBsYXlvdXQodGl0bGU9IkZhY2Vib29rIENMSSB2cyBDb21tdW5pdHkgQ0xJIikNCiAgDQoNCmBgYA0KDQojIyMjIyBGYWNlYm9vayBkYXRhDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQoNCmhlYWQoZmJfZGZfdGFycmFudCkNCg0KYGBgDQogIA0KDQoNCiMjIyMgU2FmZWdyYXBoIERhdGEgey50YWJzZXR9DQoNCg0KIyMjIyMgU2FmZWdyYXBoIFBsb3QNCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSxvdXQud2lkdGg9IjgwJSJ9DQoNCnNnX2RmX3RhcnJhbnQgJT4lDQogIHBsb3RfbHkoeD1+ZGF0ZSkgJT4lDQogIGFkZF90cmFjZSh5PX5mdWxsdGltZSwgbW9kZT0ibGluZXMiLCBuYW1lPSJGdWxsdGltZSIpICU+JQ0KICBhZGRfdHJhY2UoeT1+cGFydHRpbWUsIG1vZGU9ImxpbmVzIiwgbmFtZT0iUGFydHRpbWUiKQ0KICANCg0KYGBgDQojIyMjIyBTYWZlZ3JhcGggZGF0YQ0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KDQpoZWFkKHNnX2RmX3RhcnJhbnQpDQoNCmBgYA0KICANCg0KDQoNCiMjIyMgQXBwbGUgRGF0YSB7LnRhYnNldH0NCg0KDQojIyMjIyBBcHBsZSBQbG90DQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIG91dC53aWR0aD0iODAlIn0NCg0KYXBwbGVfbW9iX3RhcnJhbnRbLDE6NV0gJT4lDQogIHBsb3RfbHkoeD1+ZGF0ZSkgJT4lIA0KICBhZGRfdHJhY2UoeT1+ZHJpdmluZywgbW9kZT0ibGluZXMiLCBuYW1lPSJkcml2aW5nIikgJT4lDQogIGFkZF90cmFjZSh5PX53YWxraW5nLCBtb2RlPSJsaW5lcyIsIG5hbWU9IndhbGtpbmciKSAlPiUNCiAgYWRkX3RyYWNlKHk9fnRyYW5zaXQsIG1vZGU9ImxpbmVzIiwgbmFtZT0idHJhbnNpdCIpICU+JQ0KICBsYXlvdXQodGl0bGU9IkFwcGxlIG1vYmlsaXR5IGRhdGEiKQ0KDQpgYGANCiMjIyMjIE1vYmlsaXR5IGRhdGENCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCg0KaGVhZChhcHBsZV9tb2JfdGFycmFudFssMTo1XSkNCg0KYGBgDQoNCg0KPC9kaXY+DQoNCg0KPGRpdj4NCg0KIyMjIyBGZWF0dXJlcyBlbmdpbmVlcmluZw0KDQpGcm9tIGFwcGxlIGRhdGEsIHdlIGNyZWF0ZSBhIGNvbXBvc2l0ZSBpbmRpY2F0b3IgYnkgY29tYmluaW5nIHRoZSBlZmZlY3Qgb2YgZHJpdmluZyBhbmQgdHJhbnNpdCB2YXJpYWJsZXMgaW50byBhIHNpbmdsZSB2YXJpYWJsZSB3aGljaCB0aGUgdHJhbnNpdCByYXRpbyB0byB0cmFuc2l0ICsgZHJpdmluZy4gJHRyYW5zaXQvKHRyYW5zaXQrZHJpdmluZykkLiBUaGlzIHZhcmlhYmxlIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgaGlnaGVyIHRoZSB0cmFuc2l0LCB0aGUgaGlnaGVyIHRoZSByaXNrIG9mIGluZmVjdGlvbiBhbmQgdGhlIGhpZ2hlciB0aGUgZHJpdmluZywgdGhlIGxvd2VyIHRoZSByaXNrIG9mIGluZmVjdGlvbiwgaGVuY2UgZHJpdmluZyBpcyBhdCB0aGUgZGVub21pbmF0b3Igb2YgdGhlIGZvcm11bGEgYW5kIHRyYW5zaXQgYXMgd2VsbCBpcyB0aGVyZSB0byBub3JtYWxpemUgdGhlIHZhbHVlIGJldHdlZW4gMCBhbmQgMS4NCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCg0KcGxvdF9seShkYXRhID0gZGZfZmluYWwsIHg9fmRhdGUpICU+JSANCiAgYWRkX3RyYWNlKHk9fmNvbXBfaW5kaWNlLCBtb2RlPSJsaW5lcyIpICU+JQ0KICBsYXlvdXQodGl0bGU9IkFwcGxlIE1vYmlsaXR5IENvbXBvc2l0ZSBpbmRpY2F0b3IiLCB5YXhpcz1saXN0KHRpdGxlPSJNb2JpbGl0eSBpbmRleCIpKQ0KDQpgYGANCg0KPC9kaXY+DQoNCg0KPGRpdj4NCiMjIyBDb21iaW5lZCBkYXRhc2V0IHsudGFic2V0fQ0KDQojIyMjIERhdGENCg0KYGBge3J9DQoNCmRmX2ZpbmFsDQoNCmBgYA0KDQo8L2Rpdj4NCg0KPGRpdj4NCg0KYGBge3J9DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojICAgICAgICAgICAgICAgICAgIE5FVyBQSEFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIw0KIyMjIyMjIyMjIyMjIyMgVmVjdG9yIEVycm9yIGNvcnJlY3Rpb24gTW9kZWwgIyMjIyMjIyMjIyMjIyMjIyMNCnJlcXVpcmUoYnZhcnRvb2xzKQ0KcmVxdWlyZSh1cmNhKQ0KcmVxdWlyZSh2YXJzKQ0KcmVxdWlyZShkeW5sbSkNCnJlcXVpcmUoZm9yZWNhc3QpDQoNCmsgPC0gbnJvdyhkZl9maW5hbCktMTQNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyAgTWFraW5nIHRoZSBkYXRhc2V0IHN0YXRpb25hcnkgYnkgZmlyc3QgZGlmZmVyZW5jaW5nICMjIyMNCg0KZGZfZnVsbF90cyA8LSB0cyhkZl9maW5hbFssLTFdKQ0KDQpkZl9mdWxsX3RzX3N0YSA8LSBkaWZmKGRmX2Z1bGxfdHMsMSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMgQ3JlYXRpbmcgdGhlIHRyYWluaW5nIGFuZCB0ZXN0IHRpbWVzZXJpZXMgIyMjIyMjIyMjIyMjIyMjIyMjDQpkZl9maW5hbF90cyA8LSBkZl9mdWxsX3RzWzE6ayxdDQogIA0KZGZfdGVzdCA8LSBkZl9mdWxsX3RzWyhrKzEpOm5yb3coZGZfZnVsbF90cyksXQ0KDQpkZl90ZXN0X3RzIDwtIHRzKGRmX3Rlc3RbLC1jKDE6MildKQ0KDQojIyMgU3RhdGlvbmFyaXppbmcgdGhlIHRlc3QgZGF0YXNldA0KZGZfdGVzdF90c19zdGEgPC0gZGlmZihkZl90ZXN0X3RzLDEpDQoNCmBgYA0KDQojIyMjIE9yaWdpbmFsIHRpbWVzZXJpZXMNCg0KYGBge3J9DQoNCmRmXzEgPC0gZGZfZmluYWxbMTprLC0xXQ0KDQpuYW1lcyhkZl8xKSA8LSBjKCJQb3NpdGl2aXR5IiwgIkNMSSIsICJDb21tdW5pdHlfQ0xJIiwgIkZ1bGx0aW1lIiwgIlBhcnRpbWUiLCAiQXBwbGVfY29tcF9pbmRleCIpDQoNCnBsb3QodHMoZGZfMSksIG1haW49IkZpZ3VyZSAxOiBUaW1lIHNlcmllcyBwbG90IG5vbi1zdGF0aW9uYXJ5IikNCg0KDQpgYGANCg0KDQojIyMjIFN0YXRpb25hcnkgdGltZXNlcmllcw0KVGhpcyBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRpbWUgc2VyaWVzIGFmdGVyIGFwcGx5aW5nIHRoZSBmaXJzdCBkaWZmZXJlbmNlIHdpdGggdGhlIGZpcnN0IGxhZyB2YWx1ZQ0KDQoNCmBgYHtyfQ0KDQpkZl8yIDwtIGRmX2ZpbmFsWzE6aywtMV0NCg0KbmFtZXMoZGZfMikgPC0gYygiUG9zaXRpdml0eSIsICJDTEkiLCAiQ29tbXVuaXR5X0NMSSIsICJGdWxsdGltZSIsICJQYXJ0aW1lIiwgIkFwcGxlX2NvbXBfaW5kZXgiKQ0KDQpkZl8yIDwtIG5hLm9taXQoZGlmZih0cyhkZl8yKSwgMSkpDQoNCnBsb3QoZGZfMiwgbWFpbj0iRmlndXJlIDE6IFRpbWUgc2VyaWVzIHBsb3Qgbm9uLXN0YXRpb25hcnkiKQ0KDQpgYGANCjwvZGl2Pg0KDQojIyMgQnVpbGRpbmcgdGhlIFZBUiBNb2RlbHMgey50YWJzZXR9DQoNCiMjIyMgVkFSIE1vZGVsIHN1bW1hcnkNCg0KYGBge3J9DQoNCnNvdXJjZSgiZnVuY3Rpb25zLlIiKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIFZBUiBNT0RFTCBCVUlMRElORyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KI0xhZyBzZWxlY3Rpb24NCnZhcl9sYWcgPC0gVkFSc2VsZWN0KGRmX2ZpbmFsX3RzLCBsYWcubWF4ID0gOCwgdHlwZSA9ICJib3RoIiwgc2Vhc29uID0gNykNCg0KIyBFeHRyYWN0aW5nIHRoZSBsYWcgc2VsZWNpdG9uIGJ5IEFJQw0KbWF4X2xhZyA9IGFzLm51bWVyaWModmFyX2xhZyRzZWxlY3Rpb25bMV0pDQoNCiMjIE9wdGlvbiAxOiBWQVIgTW9kZWwNClZBUl9wb3MgPC0gVkFSKGRmX2ZpbmFsX3RzLCBsYWcubWF4ID0gbWF4X2xhZywgdHlwZSA9ICJib3RoIiwgc2Vhc29uID0gNykNCg0Kc3VtbWFyeShWQVJfcG9zJHZhcnJlc3VsdCRwb3NfbWEpDQoNCg0KYGBgDQoNCiMjIyMgQ29lZmZpY2llbnQgdGVzdGluZw0KDQpgYGB7cn0NCg0KY29lZnRlc3QoVkFSX3BvcyR2YXJyZXN1bHQkcG9zX21hKQ0KDQpgYGANCg0KDQojIyMgQnVpbGRpbmcgdGhlIFZFQ00gTW9kZWxzIHsudGFic2V0fQ0KDQojIyMjIFZFQ00gTW9kZWwgc3VtbWFyeQ0KDQpUaGUgbW9kZWwgc2hvd3MgNSBwb2ludCBvZiBjb2ludGVncmF0aW9uIGJ5IHRoZSB2YWx1ZXMgb2YgciBiYXNlZCBvbiB0aGUgSm9oYW5zc2VuIENvaW50ZWdyYXRpb24gdGVzdGluZyBwcm9jZWR1cmUNCg0KYGBge3J9DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMgVkVDTSBNT0RFTCBCVUlMRElORyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQprX29yZGVyIDwtIFZBUl9wb3MkcA0KDQp2ZWNtX21vZGVsMSA8LSBjYS5qbyhkZl9maW5hbF90cywgZWNkZXQgPSAibm9uZSIsIHR5cGUgPSAidHJhY2UiLCBLPWtfb3JkZXIsIHNwZWMgPSAidHJhbnNpdG9yeSIpDQoNCnZlY21fbW9kZWwyIDwtIGNhLmpvKGRmX2ZpbmFsX3RzLCBlY2RldCA9ICJub25lIiwgdHlwZSA9ICJ0cmFjZSIsIEs9a19vcmRlciwgc3BlYyA9ICJ0cmFuc2l0b3J5Iiwgc2Vhc29uID0gNykNCg0Kc3VtbWFyeSh2ZWNtX21vZGVsMikNCg0KYGBgDQoNCiMjIyBGb3JlY2FzdGluZyB3aXRoIFZFQ00gbW9kZWwNCg0KIyMjIyBVc2luZyBmaXJzdCBDb2ludGVncmF0aW9uIHBvaW50IHZzIGV4aXN0aW5nIGRhdGENCg0KYGBge3J9DQoNCnJlcXVpcmUodmFycykNCg0KIyMjIENvbnZlcnRpbmcgYmFjayBWRUNNIHRvIG5ldyBWQVIgbW9kZWwNCg0KVkFSX3Bvc19SIDwtIGxhcHBseShjKDE6NSksIGZ1bmN0aW9uKHgpIHZlYzJ2YXIodmVjbV9tb2RlbDEsIHI9eCkpDQoNClZBUl9wb3NfUl9zZWFzIDwtIGxhcHBseShjKDE6NSksIGZ1bmN0aW9uKHgpIHZlYzJ2YXIodmVjbV9tb2RlbDIsIHI9eCkpDQoNCiNWQVJfcG9zX1IxIDwtIHZlYzJ2YXIodmVjbV9tb2RlbDEsIHI9MSkNCiNWQVJfcG9zX1IyIDwtIHZlYzJ2YXIodmVjbV9tb2RlbDEsIHI9MikNCiNWQVJfcG9zX1IzIDwtIHZlYzJ2YXIodmVjbV9tb2RlbDEsIHI9MykNCiNWQVJfcG9zX1I0IDwtIHZlYzJ2YXIodmVjbV9tb2RlbDEsIHI9NCkNCiNWQVJfcG9zX1I1IDwtIHZlYzJ2YXIodmVjbV9tb2RlbDEsIHI9NSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjDQojIyMgUHJlZGljdGlvbiB1c2luZyB0aGUgVkVDTV9UT19WQVJfUjEgIyMjDQoNCiMjIyBQcmVkaWN0aW9uIHdpdGggdGVzdCBkYXRhc2V0DQoNCm5kYXlzIDwtIDE0DQoNClZBUl9wb3NfUl9wcmVkIDwtIGxhcHBseShWQVJfcG9zX1IsIGZ1bmN0aW9uKHgpIHByZWRpY3QoeCwgbmV3X2RhdGE9ZGZfdGVzdF90cywgYWhlYWQ9bmRheXMpKQ0KDQojIyMgUHJlZGljdGlvbiB3aXRoIFNlYXNvbmFsaXR5DQpWQVJfcG9zX1Jfc2Vhc19wcmVkIDwtIGxhcHBseShWQVJfcG9zX1Jfc2VhcywgZnVuY3Rpb24oeCkgcHJlZGljdCh4LCBuZXdfZGF0YT1kZl90ZXN0X3RzLCBhaGVhZD1uZGF5cykpDQoNCg0KIyMjIFBsb3R0aW5nIHByZWRpY3Rpb25zDQoNCnBsdF9SIDwtIGxhcHBseShWQVJfcG9zX1IsIGZ1bmN0aW9uKHgpIHZhcl9wcmVkKG1vZGVsID0geCwgZGY9ZGZfdGVzdF90cywgYWhlYWQ9bmRheXMpKQ0KDQpwbHRfUl9zZWFzIDwtIGxhcHBseShWQVJfcG9zX1Jfc2VhcywgZnVuY3Rpb24oeCkgdmFyX3ByZWQobW9kZWwgPSB4LCBkZj1kZl90ZXN0X3RzLCBhaGVhZD1uZGF5cykpDQoNCg0KI3Zhcl9wcmVkKG1vZGVsID0gVkFSX3Bvc19SMiwgIGRmPWRmX3Rlc3RfdHMsIGFoZWFkPTE0KQ0KDQojdmFyX3ByZWQobW9kZWwgPSBWQVJfcG9zX1IzLCAgZGY9ZGZfdGVzdF90cywgYWhlYWQ9MTQpDQoNCiN2YXJfcHJlZChtb2RlbCA9IFZBUl9wb3NfUjQsICBkZj1kZl90ZXN0X3RzLCBhaGVhZD0xNCkNCg0KI3Zhcl9wcmVkKG1vZGVsID0gVkFSX3Bvc19SNSwgIGRmPWRmX3Rlc3RfdHMsIGFoZWFkPTE0KQ0KDQojIyMgRm9yZWNhc3RpbmcgYXV0by1yZWdyZXNzaXZlbHkNCg0KI3Zhcl9mb3JlY2FzdChtb2RlbCA9IFZBUl9wb3NfUjEsIGFoZWFkPTE0LCBhY3R1YWxfZGY9ZGZfZmluYWwpDQp2YXJfZm9yZWNhc3QobW9kZWwgPSBWQVJfcG9zX1IxLCBhaGVhZD02MCwgYWN0dWFsX2RmPWRmX2ZpbmFsKQ0KdmFyX2ZvcmVjYXN0KG1vZGVsID0gVkFSX3Bvc19SMiwgYWhlYWQ9MzAsIGFjdHVhbF9kZj1kZl9maW5hbCkNCnZhcl9mb3JlY2FzdChtb2RlbCA9IFZBUl9wb3NfUjMsIGFoZWFkPTMwLCBhY3R1YWxfZGY9ZGZfZmluYWwpDQp2YXJfZm9yZWNhc3QobW9kZWwgPSBWQVJfcG9zX1I0LCBhaGVhZD0zMCwgYWN0dWFsX2RmPWRmX2ZpbmFsKQ0KdmFyX2ZvcmVjYXN0KG1vZGVsID0gVkFSX3Bvc19SNSwgYWhlYWQ9MzAsIGFjdHVhbF9kZj1kZl9maW5hbCkNCg0Kc2F2ZShWQVJfcG9zX1IsIGZpbGUgPSAiVkFSX3Bvc19SLnJkYSIpDQpzYXZlKFZBUl9wb3NfUl9zZWFzLCBmaWxlID0gIlZBUl9wb3NfUl9zZWFzLnJkYSIpDQojc2F2ZShWQVJfcG9zX1JfcHJlZCwgZmlsZSA9ICJWQVJfcG9zX1JfcHJlZC5yZGEiKQ0KI3NhdmUoVkFSX3Bvc19SX3NlYXNfcHJlZCwgZmlsZSA9ICJWQVJfcG9zX1Jfc2Vhc19wcmVkLnJkYSIpDQojc2F2ZShwbHRfUiwgZmlsZSA9ICJwbHRfUi5yZGEiKQ0KI3NhdmUocGx0X1Jfc2VhcywgZmlsZSA9ICJwbHRfUl9zZWFzLnJkYSIpDQoNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIFRoZSBFbmQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmBgYA0KDQo8ZGl2Pg0KIyMjIyMgUHJlZGljdGlvbiBhY2N1cmFjeQ0KDQpgYGB7cn0NCg0KcmVxdWlyZSgiaWUybWlzYyIpDQptYXBlX1IgPC0gbGFwcGx5KFZBUl9wb3NfUiwgZnVuY3Rpb24oeCkgbWFwZShWQVJfcG9zX1JfcHJlZFtbMV1dJGZjc3QkcG9zX21hWywiZmNzdCJdLCBkZl90ZXN0WzE6MTAsInBvc19tYSJdICkpDQoNCm1hcGVfUg0KDQpgYGANCg0KPC9kaXY+DQoNCg0KPHA+PHA+DQoNCg0KIyMgVVNJTkcgVEhFIEZ1bGwgZGF0YXNldCBGT1IgRk9SRUNBU1RJTkcgRlVUVVJFIERBVEVTIFdJVEhPVVQgQVZBSUxBQkxFIFBSRURJQ1RPUlMgREFUQSAjIw0KDQpgYGB7cn0NCg0KIyMjIyMgVGVzdCB3aXRoIGZ1bGwgZGF0YQ0KDQojTGFnIHNlbGVjdGlvbg0KdmFyX2xhZzEgPC0gVkFSc2VsZWN0KGRmX2Z1bGxfdHMsIGxhZy5tYXggPSA4LCB0eXBlID0gImJvdGgiLCBzZWFzb24gPSA3KQ0KDQojIEV4dHJhY3RpbmcgdGhlIGxhZyBzZWxlY2l0b24gYnkgQUlDDQptYXhfbGFnMSA9IGFzLm51bWVyaWModmFyX2xhZzEkc2VsZWN0aW9uWzFdKQ0KDQojIyBPcHRpb24gMTogVkFSIE1vZGVsDQpWQVJfcG9zMSA8LSBWQVIoZGZfZnVsbF90cywgbGFnLm1heCA9IG1heF9sYWcsIHR5cGUgPSAiYm90aCIsIHNlYXNvbiA9IDcpDQoNCnN1bW1hcnkoVkFSX3BvczEkdmFycmVzdWx0JHBvc19tYSkNCg0KDQpgYGANCmBgYHtyfQ0KDQprX29yZGVyMSA8LSBWQVJfcG9zMSRwDQoNCnZlY21fbW9kZWwxMSA8LSBjYS5qbyhkZl9mdWxsX3RzLCBlY2RldCA9ICJub25lIiwgdHlwZSA9ICJ0cmFjZSIsIEs9a19vcmRlciwgc3BlYyA9ICJ0cmFuc2l0b3J5IikNCg0KdmVjbV9tb2RlbDIxIDwtIGNhLmpvKGRmX2Z1bGxfdHMsIGVjZGV0ID0gIm5vbmUiLCB0eXBlID0gInRyYWNlIiwgSz1rX29yZGVyLCBzcGVjID0gInRyYW5zaXRvcnkiLCBzZWFzb24gPSA3KQ0KDQpzdW1tYXJ5KHZlY21fbW9kZWwyMSkNCg0KYGBgDQoNCg0KYGBge3J9DQoNClZBUl9wb3NfUnMgPC0gbGFwcGx5KGMoMTo1KSwgZnVuY3Rpb24oeCkgdmVjMnZhcih2ZWNtX21vZGVsMTEsIHI9eCkpDQpzYXZlKFZBUl9wb3NfUnMsIGZpbGU9IlZBUl9wb3NfUnMucmRhIikNCg0KVkFSX3Bvc19Sc19zZWFzIDwtIGxhcHBseShjKDE6NSksIGZ1bmN0aW9uKHgpIHZlYzJ2YXIodmVjbV9tb2RlbDIxLCByPXgpKQ0Kc2F2ZShWQVJfcG9zX1JzX3NlYXMsIGZpbGU9IlZBUl9wb3NfUnNfc2Vhcy5yZGEiKQ0KDQoNClZBUl9wb3NfUnNfcHJlZCA8LSBsYXBwbHkoVkFSX3Bvc19ScywgZnVuY3Rpb24oeCkgcHJlZGljdCh4LCAgYWhlYWQ9MTQpKQ0KDQojIyMgUHJlZGljdGlvbiB3aXRoIFNlYXNvbmFsaXR5DQpWQVJfcG9zX1Jfc2Vhc19wcmVkIDwtIGxhcHBseShWQVJfcG9zX1JzX3NlYXMsIGZ1bmN0aW9uKHgpIHByZWRpY3QoeCwgbmV3X2RhdGE9ZGZfZnVsbF90cywgYWhlYWQ9bmRheXMpKQ0KDQoNCiMjIyBQbG90dGluZyBwcmVkaWN0aW9ucw0KDQpwbHRfUnMgPC0gbGFwcGx5KFZBUl9wb3NfUnMsIGZ1bmN0aW9uKHgpIHZhcl9mb3JlY2FzdChtb2RlbCA9IHgsIGFoZWFkPTE0KSkNCg0KcGx0X1JzX3NlYXMgPC0gbGFwcGx5KFZBUl9wb3NfUnNfc2VhcywgZnVuY3Rpb24oeCkgdmFyX3ByZWQobW9kZWwgPSB4LCBkZj1kZl9mdWxsX3RzLCBhaGVhZD1ucm93KGRmX2Z1bGxfdHMpKSkNCg0KDQpwbG90KFZBUl9wb3NfUnNfcHJlZFtbNV1dJGZjc3QkcG9zX21hWywiZmNzdCJdLCB0eXBlPSJsIikNCg0KVkFSX2ZvcmVjYXN0IDwtIHByZWRpY3QoVkFSX3Bvc19Sc1tbMl1dLCBuLmFoZWFkPTE0KQ0KDQpwbG90KFZBUl9mb3JlY2FzdCkNCg0KYGBgDQoNCg0KYGBge3J9DQoNCiMjIyBDcmVhdGluZyB0aGUgdmVjdG9yIG9mIGRheXMgYWhlYWQgY29ycmVzcG9uZGluZyB0byB0aGUgZm9yZWNhc3QNCmRheXNfYWhlYWQgPC0gbGFzdChkZl9maW5hbCRkYXRlKStkYXlzKDA6bmRheXMpWy0xXQ0KZmNzdF9haGVhZCA8LSBWQVJfZm9yZWNhc3QkZmNzdCRwb3NfbWFbLCJmY3N0Il0NCg0KIyMjIG9ubHkgdGhlIGRhdGEgcGFydCBvZiB0aGUgZm9yZWNhc3QgbmRheXMgYWhlYWQNCmRmX2Zjc3Rfb25seSA8LSB0aWJibGUoZGF0ZT1kYXlzX2FoZWFkLCANCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9VkFSX2ZvcmVjYXN0JGZjc3QkcG9zX21hWywiZmNzdCJdLCANCiAgICAgICAgICAgICAgICAgICAgICAgbG93ZXI9VkFSX2ZvcmVjYXN0JGZjc3QkcG9zX21hWywibG93ZXIiXSwNCiAgICAgICAgICAgICAgICAgICAgICAgdXBwZXI9VkFSX2ZvcmVjYXN0JGZjc3QkcG9zX21hWywidXBwZXIiXSkNCg0KIyMjIEJpbmRpbmcgdGhlIGRhdGVzIG9mIHRoZSBhY3R1YWwgdG8gdGhlIGRheXMgYWhlYWQgYW5kIHRoZSBBY3R1YWwgdmFsdWVzIHRvIHRoZSBwcmVkaWN0aW9uIGFoZWFkDQpkZl9mY3N0IDwtIHRpYmJsZShkYXRlPWMoZGZfZmluYWwkZGF0ZSwgZGF5c19haGVhZCksIHZhbHVlPWMoZGZfZmluYWwkcG9zX21hLFZBUl9mb3JlY2FzdCRmY3N0JHBvc19tYVssImZjc3QiXSkpDQoNCnBsb3RfbHkoKSAlPiUNCiAgYWRkX2xpbmVzKGRhdGEgPSBkZl9mY3N0LCB4PX5kYXRlLCB5PX52YWx1ZSwgbmFtZT0iUG9zaXRpdml0eSByYXRlIikgJT4lDQogIGFkZF9yaWJib25zKGRhdGEgPSBkZl9mY3N0X29ubHksIA0KICAgICAgICAgICAgICB4PX5kYXRlLA0KICAgICAgICAgICAgICB5bWluID0gfmxvd2VyLA0KICAgICAgICAgICAgICB5bWF4ID0gfnVwcGVyLA0KICAgICAgICAgICAgICBjb2xvcj1JKCJvcmFuZ2UiKSwNCiAgICAgICAgICAgICAgbmFtZSA9ICI5NSUgY29uZmlkZW5jZSIpDQoNCmBgYA0KDQo=